package 设计模式.创建型.单例模式.一处理资源冲突问题打印日志的程序.最初实现;


import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 自定义实现了一个往文件中打印日志的 Logger 类
 * 这段代码存在的问题:
 *  所有的日志都写入到同一个文件,在 UserController 和 OrderController 中，我们分别创建两个 Logger 对象。
 *  在 Web 容器的 Servlet 多线程环境下，如果两个 Servlet 线程同时分别执行 login() 和 create() 两个函数，并且同时写日志到 log.txt 文件中，那就有可能存在日志信息互相覆盖的情况。
 *  在多线程环境下，如果两个线程同时给同一个共享变量加 1，因为共享变量是竞争资源，所以，共享变量最后的结果有可能并不是加了 2，而是只加了 1。同理，这里的 log.txt 文件也是竞争资源，两个线程同时往里面写数据，就有可能存在互相覆盖的情况。
 *
 * 解决办法：
 *  通过加锁的方式：给 log() 函数加互斥锁（Java 中可以通过 synchronized 的关键字），同一时刻只允许一个线程调用执行 log() 函数。
 *
 */
public class Logger {
    private FileWriter writer;

    public Logger() throws IOException {
        File file = new File("/Users/user/log.txt");
        //true表示追加写入
        writer = new FileWriter(file, true);
    }

    public void log(String message) throws IOException {
        writer.write(message);
    }
}



